WebAssembly threads
This proposal adds a new shared linear memory type and some new operations for atomic memory access. The responsibility of creating and joining threads is deferred to the embedder.
Example
i32の変数をmutexに使う: 0: unlock, 1: lock
jsでconst mutexAddr=0をmain, workerでそれぞれ作り、wasmの呼び出し時に渡す
あくまでアドレス、ハンドルなのでjs側では何もできない
let memory = new WebAssembly.Memory({initial: 1, maximum: 1, shared: true});
shared: trueで、agent cluster内のagent間で共有できる
agent = threadと考えて良い
maximumも指定する必要があり、このサイズまでgrowできる
この例だと、initial = maximum = i32 = 1byte
worker.postMessage(memory); でmain -> workerに送る
Webassembly.Memoryの中でCreateMemoryObjectが呼ばれる
wasmの中でatomicに操作される
tryLockMutex
i32.atomic.rmw.cmpxchg addr 0 1
compare exchange
addrが0なら1にする、をatomicに行う
lockMutex
tryLockMutexをloopする
memory.atomic.wait32 addr 1
他のスレッドのunlockでnotifyされるまで待つ
busy waitingを避けるために、suspend, woken
unlockMutex
i32.atomic.store addr 0
memory.atomic.notify addr 1